package comAPIdlw.request;

import java.io.*;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.Map;
import java.util.Set;

/**
 * @Author: dlw
 * @QQ : 1595507337
 * @desc:  该函数用于实现get请求，并将请求的结果返回
 * @Date: 2021/12/4 9:31
 */

/**
 * Union  Resource  Location  == url 统一资源定位
 * path  请求的资源的路径
 * Property   :属性
 * 字节流   按字符读取
 * 字符流   按行读
 *
 */
public class HttpUtils {

       public static String  get(String path){
           String line="";//最开始的空行
               //result  网络请求结果
           String result="";//最后读取的结果
           BufferedReader reader=null;
           InputStreamReader inputStreamReader=null;
           InputStream inputStream=null;
           try {
               //创建连接对象
               URL url = new URL(path);
               //打开连接
               URLConnection conn = url.openConnection();
               //进行连接
               conn.connect();
               //获取输入流    管道里面拿path
               inputStream = conn.getInputStream();
              //转换流   为了读取更多数据
               inputStreamReader = new InputStreamReader(inputStream);
               reader = new BufferedReader(inputStreamReader);
               //读取每一行
               while ((line=reader.readLine())!=null){
                      result+=line;
               }


           } catch (MalformedURLException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }finally {
               //关闭读取流
               try {
               if (reader !=null) {
                   reader.close();
               }
                   if (inputStreamReader !=null) {
                       inputStreamReader.close();
                   }
                   if (inputStream !=null)
                       inputStream.close();

                   } catch (IOException e) {
                   e.printStackTrace();
               }
           }
             return  result;

       }

       /*
          封装Java 原生实现post  ，并返回数据结果
          path   请求的路径
          header  请求头信息
          data  请求的数据
          return  返回的结果
          该类用于实现调用比特币客户端的getbase
        */

       public static String post(String path, Map<String, String> header,byte[] data){
           OutputStream outputStream=null;
           InputStream inputStream=null;
           BufferedReader reader=null;
           String result="";

           try {
               //路径连接
               URL url=new URL(path);
               HttpURLConnection conn =(HttpURLConnection) url.openConnection();
               //设置可以发送数据和接收数据
               conn.setDoInput(true);
               conn.setDoOutput(true);
               //请求头信息设置     动态设置
               //ContentType:application/json
               //如何将map中的数据读取出来
               //list  有序  数据重复   for循坏  增强for循环
               //set  无序  数据不能重复   增强for循环   ，迭代器
               //map  无序  key不能重复 ，string value =  get(key)
         if (!header.isEmpty()){
                   Set<String> keys = header.keySet();
                   for (String key : keys) {
                       String value = header.get(key);
                       conn.setRequestProperty(key,value);
                   }
               }
             conn.setRequestMethod("POST");
               conn.connect();
         //将请求的数据发送出去
               outputStream = conn.getOutputStream();
               outputStream.write(data);
               //接收响应数据
               inputStream = conn.getInputStream();
               //inputStream.read()
               /*
                 io流    字符流读取  reader
                          字符流写入  writer
                             转换流   字节输入读取流    字节输出写入流
                */
                                           //字符读取流   需要转换流
               reader = new BufferedReader(new InputStreamReader(inputStream));
                  String  line=null;

               while ((line= reader.readLine()) !=null){
                                  //读取用结果装起来
                      result+=line;
                  }

           } catch (MalformedURLException e) {
               e.printStackTrace();
           } catch (IOException e) {
               e.printStackTrace();
           }finally {
                     try {
                         if (reader !=null){
                             reader.close();
                         }
                         if (inputStream !=null){
                             inputStream.close();
                         }
                         if (outputStream !=null){
                             outputStream.close();
                         }
                     } catch (IOException e) {
                         e.printStackTrace();
                     }
           }
           return result;
       }


}
